{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Solving the out-of-context chunk problem for RAG\n",
    "\n",
    "A large percentage of the problems developers face with RAG comes down to this: Individual chunks oftentimes do not contain sufficient context to be properly used by the retrieval system or the LLM. This leads to the inability to answer questions and, more worryingly, hallucinations.\n",
    "\n",
    "Examples of this problem\n",
    "- Chunks oftentimes refer to their subject via implicit references and pronouns. This causes them to not be retrieved when they should be, or to not be properly understood by the LLM.\n",
    "- Individual chunks oftentimes don’t contain the complete answer to a question. The answer may be scattered across a few adjacent chunks.\n",
    "- Adjacent chunks presented to the LLM out of order cause confusion and can lead to hallucinations.\n",
    "- Naive chunking can lead to text being split “mid-thought” leaving neither chunk with useful context.\n",
    "- Individual chunks oftentimes only make sense in the context of the entire section or document, and can be misleading when read on their own."
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# What would a solution look like?\n",
    "There are two solutions that, when used together, solve the bulk of these problems.\n",
    "\n",
    "#### Contextual chunk headers\n",
    "The idea here is to add in higher-level context to the chunk by prepending a chunk header. This chunk header could be as simple as just the document title, or it could use a combination of document title, a concise document summary, and the full hierarchy of section and sub-section titles.\n",
    "\n",
    "#### Chunks -> segments\n",
    "Large chunks provide better context to the LLM than small chunks, but they also make it harder to precisely retrieve specific pieces of information. Some queries (like simple factoid questions) are best handled by small chunks, while other queries (like higher-level questions) require very large chunks. What we really need is a more dynamic system that can retrieve short chunks when that's all that's needed, but can also retrieve very large chunks when required. How do we do that?\n",
    "\n",
    "Given that relevant chunks tend to be clustered within their original documents, what if we could identify those clusters and concatenate all of the chunks back into their original form? This would provide much more complete and understandable context to the LLM than just providing the individual (and out-of-order) chunks."
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Setup\n",
    "First, we need to import some things and set API keys."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "sys.path.append(\"../\")\n",
    "from dsrag.knowledge_base import KnowledgeBase\n",
    "from dsrag.dsparse.file_parsing.non_vlm_file_parsing import extract_text_from_pdf\n",
    "from dsrag.rse import get_best_segments\n",
    "import cohere\n",
    "import os\n",
    "from scipy.stats import beta\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# set API keys\n",
    "import os\n",
    "os.environ[\"OPENAI_API_KEY\"] = \"\"\n",
    "os.environ[\"CO_API_KEY\"] = \"\""
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Load in document and add to KB\n",
    "We'll go ahead and add the document to a dsRAG knowledge base, which will take care of semantic sectioning and chunking. Semantic sectioning is the process of breaking a document into semantically cohesive sections. These sections are then broken up into smaller chunks if needed. Each section is given a descriptive title, which we'll use later in the ranking process."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "FORM 10-K FORM 10-KUNITED STATES\n",
      "SECURITIES AND EXCHANGE COMMISSION\n",
      "Washington, D.C. 20549\n",
      "FORM 10-K \n",
      "(Mark One)\n",
      "☑ ANNUAL REPORT PURSUANT TO SECTION 13 OR 15(D) OF THE SECURITIES EXCHANGE ACT OF 1934\n",
      "FOR THE FISCAL YEAR ENDED MAY 31, 2023 \n",
      "OR\n",
      "☐TRANSITION REPORT PURSUANT TO SECTION 13 OR 15(D) OF THE SECURITIES EXCHANGE ACT OF 1934\n",
      "FOR THE TRANSITION PERIOD FROM TO .\n",
      "Commission File No. 1-10635 \n",
      "NIKE, Inc. \n",
      "(Exact name of Registrant as specified in its charter)\n",
      "Oregon 93-0584541\n",
      "(State or other jurisdiction of incorporation) (IRS Employer Identification No.)\n",
      "One Bowerman Drive, Beaverton, Oregon 97005-6453 \n",
      "(Address of principal executive offices and zip code)\n",
      "(503) 671-6453 \n",
      "(Registrant's telephone number, including area code)\n",
      "SECURITIES REGISTERED PURSUANT TO SECTION 12(B) OF THE ACT:\n",
      "Class B Common Stock NKE New York Stock Exchange\n",
      "(Title of each class) (Trading symbol) (Name of each exchange on which registered)\n",
      "SECURITIES REGISTERED PURSUANT TO SECTION 12(G) OF THE ACT:\n",
      "NONE\n",
      "Indica\n"
     ]
    }
   ],
   "source": [
    "# load in some data\n",
    "#file_path = \"../tests/data/levels_of_agi.pdf\"\n",
    "file_path = \"../tests/data/nike_2023_annual_report.txt\"\n",
    "doc_id = os.path.basename(file_path).split(\".\")[0] # grab the file name without the extension so we can use it as the doc_id\n",
    "\n",
    "# kb_id = \"levels_of_agi\"\n",
    "kb_id = \"nike_10k\"\n",
    "\n",
    "if file_path.endswith(\".pdf\"):\n",
    "    document_text, _ = extract_text_from_pdf(file_path)\n",
    "else:\n",
    "    with open(file_path, \"r\") as f:\n",
    "        document_text = f.read()\n",
    "\n",
    "print (document_text[:1000])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# NOTE: the two sample KBs used in this notebook already exist in the example_kb_data directory, so you don't need to run this cell unless you want to create a new KB\n",
    "\n",
    "# add to knowledge base\n",
    "#kb = KnowledgeBase(kb_id=kb_id, exists_ok=False, storage_directory='example_kb_data') # create a new knowledge base\n",
    "#kb.add_document(doc_id=doc_id, text=document_text) # add the document to the knowledge base"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# View chunks and sections"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "493\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'section_title': 'Form 10-K Cover Page and Company Information',\n",
       " 'chunk_text': \"FORM 10-K FORM 10-KUNITED STATES\\nSECURITIES AND EXCHANGE COMMISSION\\nWashington, D.C. 20549\\nFORM 10-K \\n(Mark One)\\n☑ ANNUAL REPORT PURSUANT TO SECTION 13 OR 15(D) OF THE SECURITIES EXCHANGE ACT OF 1934\\nFOR THE FISCAL YEAR ENDED MAY 31, 2023 \\nOR\\n☐TRANSITION REPORT PURSUANT TO SECTION 13 OR 15(D) OF THE SECURITIES EXCHANGE ACT OF 1934\\nFOR THE TRANSITION PERIOD FROM TO .\\nCommission File No. 1-10635 \\nNIKE, Inc. \\n(Exact name of Registrant as specified in its charter)\\nOregon 93-0584541\\n(State or other jurisdiction of incorporation) (IRS Employer Identification No.)\\nOne Bowerman Drive, Beaverton, Oregon 97005-6453 \\n(Address of principal executive offices and zip code)\\n(503) 671-6453 \\n(Registrant's telephone number, including area code)\\nSECURITIES REGISTERED PURSUANT TO SECTION 12(B) OF THE ACT:\"}"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# load in chunks\n",
    "kb = KnowledgeBase(kb_id=kb_id, exists_ok=True, storage_directory='example_kb_data')\n",
    "\n",
    "num_chunks = len(kb.chunk_db.data[doc_id])\n",
    "print (num_chunks)\n",
    "\n",
    "chunks = []\n",
    "for i in range(num_chunks):\n",
    "    chunk = {\n",
    "        \"section_title\": kb.chunk_db.get_section_title(doc_id, i),\n",
    "        \"chunk_text\": kb.chunk_db.get_chunk_text(doc_id, i),\n",
    "    }\n",
    "\n",
    "    chunks.append(chunk)\n",
    "\n",
    "chunks[0]"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's print out all of the sections that the semantic sectioning process identified."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Form 10-K Cover Page and Company Information\n",
      "Table of Contents\n",
      "Business Overview\n",
      "Product Offerings\n",
      "Sales and Marketing Strategy\n",
      "Market Segments and Geographic Operations\n",
      "Significant Customer Information\n",
      "Product Research, Design and Development\n",
      "Manufacturing and Supply Chain Overview\n",
      "International Operations and Trade Challenges\n",
      "Competition in the Athletic Footwear and Apparel Industry\n",
      "Intellectual Property Rights and Protection\n",
      "Human Capital Resources and Company Culture\n",
      "Employee Base and Labor Relations\n",
      "Diversity, Equity, and Inclusion Initiatives\n",
      "Compensation and Benefits Overview\n",
      "Available Information and Websites\n",
      "Information About Executive Officers\n",
      "Forward-Looking Statements and Risk Factors Introduction\n",
      "Global Economic Conditions and Their Impact on NIKE's Business\n",
      "Intense Competition in the Athletic Footwear, Apparel, and Equipment Industry\n",
      "Currency Exchange Rate Fluctuations and Their Effects on Financial Results\n",
      "Financial Health of Wholesale Customers and Its Impact on NIKE\n",
      "Climate Change and Sustainability-Related Challenges\n",
      "Extreme Weather Conditions and Natural Disasters: Risks and Impacts\n",
      "Impact of Pandemics and Public Health Emergencies on Financial Condition and Operations\n",
      "Business and Operational Risks\n",
      "Importance of Maintaining Brand Reputation and Image\n",
      "Impact of Seasonality on Business Operations\n",
      "Challenges in Anticipating Consumer Preferences and Developing New Products\n",
      "Reliance on Technical Innovation and Product Quality\n",
      "Importance of High-Quality Product Endorsers\n",
      "Risks Associated with Inventory Management and Demand Forecasting\n",
      "Challenges and Investments in NIKE Direct Operations\n",
      "Risks Associated with Digital Commerce and Technology Systems\n",
      "Risks Related to Licensing and Retail Market Concentration\n",
      "Financial and Operational Risks\n",
      "Human Resources and Workplace Culture Risks\n",
      "Risks of International Operations\n",
      "Risks Associated with Overseas Sourcing, Manufacturing, and Financing\n",
      "Dependence on Global Distribution Facilities\n",
      "Legal, Regulatory, and Compliance Risks\n",
      "Impact of Trade Policies and Tariffs on Business Operations\n",
      "Intellectual Property Protection Challenges\n",
      "Data Security and Privacy Risks\n",
      "Tax-Related Risks and Uncertainties\n",
      "Risks Related to Contractor and Licensee Compliance\n",
      "Financial and Investment Risks\n",
      "Risks Related to Stock Ownership and Market Perception\n",
      "Unresolved Staff Comments\n",
      "Properties Overview\n",
      "Legal Proceedings\n",
      "Mine Safety Disclosures\n",
      "Market Information and Stock Repurchase Program\n",
      "Performance Graph and Stock Comparison\n",
      "Management's Discussion and Analysis Overview\n",
      "Financial Highlights for Fiscal 2023\n",
      "Current Economic Conditions and Market Dynamics\n",
      "Recent Developments in Business Operations\n",
      "Use of Non-GAAP Financial Measures\n",
      "Results of Operations\n",
      "NIKE, Inc. Revenue Overview\n",
      "NIKE Brand Revenue Highlights for Fiscal 2023\n",
      "Gross Margin Analysis\n",
      "Selling and Administrative Expenses\n",
      "Other Income and Expenses\n",
      "Income Taxes\n",
      "Operating Segments Overview\n",
      "North America Segment Performance\n",
      "Europe, Middle East & Africa Segment Performance\n",
      "Greater China Financial Results\n",
      "Asia Pacific & Latin America Financial Results\n",
      "Global Brand Divisions Financial Results\n",
      "Converse Financial Results\n",
      "Corporate Financial Results\n",
      "Overview of Foreign Currency Exposures and Risk Management\n",
      "Transactional Exposures and Their Management\n",
      "Translational Exposures and Their Management\n",
      "Net Investments in Foreign Subsidiaries\n",
      "Liquidity and Capital Resources: Cash Flow Activity\n",
      "Capital Resources and Credit Facilities\n",
      "Cash Requirements and Liquidity\n",
      "Off-Balance Sheet Arrangements\n",
      "New Accounting Pronouncements\n",
      "Critical Accounting Estimates\n",
      "Quantitative and Qualitative Disclosures About Market Risk\n",
      "Market Risk Measurement\n",
      "Interest Rate and Foreign Currency Risk Management\n",
      "Management's Responsibility for Financial Statements\n",
      "Management's Annual Report on Internal Control over Financial Reporting\n",
      "Independent Auditor's Report\n",
      "Consolidated Financial Statements\n",
      "Consolidated Statements of Shareholders' Equity\n",
      "Notes to Consolidated Financial Statements - Table of Contents\n",
      "Company Overview and Brand Portfolio\n",
      "Basis of Consolidation\n",
      "Revenue Recognition and Sales-Related Reserves\n",
      "Cost of Sales\n",
      "Demand Creation Expense\n",
      "Operating Overhead Expense\n",
      "Cash, Equivalents, and Short-Term Investments\n",
      "Accounts Receivable and Inventory Valuation\n",
      "Property, Plant and Equipment\n",
      "Software Development Costs\n",
      "Impairment of Long-Lived Assets\n",
      "Goodwill and Indefinite-Lived Intangible Assets\n",
      "Operating Leases\n",
      "Fair Value Measurements\n",
      "Foreign Currency Translation and Transactions\n",
      "Accounting for Derivatives and Hedging Activities\n",
      "Stock-Based Compensation\n",
      "Earnings Per Share\n",
      "Management Estimates\n",
      "Recently Issued Accounting Standards\n",
      "Accrued Liabilities\n",
      "Fair Value Measurements Details\n",
      "Short-Term Borrowings and Credit Lines\n",
      "Long-Term Debt Overview\n",
      "Redeemable Preferred Stock\n",
      "Common Stock Overview\n",
      "Stock Options\n",
      "Employee Stock Purchase Plans\n",
      "Restricted Stock and Restricted Stock Units\n",
      "Benefit Plans\n",
      "Introduction to Risk Management and Derivatives\n",
      "Fair Value of Derivative Instruments\n",
      "Cash Flow Hedges\n",
      "Fair Value Hedges and Net Investment Hedges\n",
      "Undesignated Derivative Instruments\n",
      "Credit Risk and Counterparty Management\n",
      "Accumulated Other Comprehensive Income (Loss)\n",
      "Revenue Disaggregation\n",
      "Revenue Data for Fiscal Year 2022\n",
      "Revenue Data for Fiscal Year 2021\n",
      "Sales-Related Reserves\n",
      "Financial Data by Operating Segment\n",
      "Revenues and Long-Lived Assets by Geographic Area\n",
      "Commitments and Contingencies\n",
      "Leases\n",
      "Acquisitions and Divestitures\n",
      "Restructuring and Financial Information\n",
      "Changes in Accountants and Controls and Procedures\n",
      "Directors, Executive Officers, and Corporate Governance\n",
      "Executive Compensation\n",
      "Security Ownership and Related Stockholder Matters\n",
      "Related Transactions and Director Independence\n",
      "Principal Accountant Fees and Services\n",
      "Exhibits and Financial Statement Schedules\n",
      "Valuation and Qualifying Accounts\n",
      "Form 10-K Summary\n",
      "Consent of Independent Registered Public Accounting Firm\n",
      "Signatures and Certification\n",
      "Board of Directors Information\n",
      "Corporate Officers\n",
      "Subsidiary Brands and Headquarters Locations\n",
      "Shareholder Information and Services\n"
     ]
    }
   ],
   "source": [
    "# print all section titles\n",
    "unique_section_titles = []\n",
    "for i in range(num_chunks):\n",
    "    section_title = chunks[i][\"section_title\"]\n",
    "    if section_title not in unique_section_titles:\n",
    "        print (section_title)\n",
    "        unique_section_titles.append(section_title)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Add contextual chunk headers and measure impact\n",
    "We'll use the Cohere Rerank API for rank our chunks. Normally, we'd start with a vector and/or keyword search to narrow down the list of candidates, but since we're just dealing with a single document here we can just send all chunks directly to the reranker, keeping things a bit simpler."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def transform(x):\n",
    "    \"\"\"\n",
    "    Transformation function to map the absolute relevance value to a value that is more uniformly distributed between 0 and 1\n",
    "    - This is critical for the new version of RSE to work properly, because it utilizes the absolute relevance values to calculate the similarity scores\n",
    "    - The relevance values given by the Cohere reranker tend to be very close to 0 or 1. This beta function used here helps to spread out the values more uniformly.\n",
    "    \"\"\"\n",
    "    a, b = 0.4, 0.4  # These can be adjusted to change the distribution shape\n",
    "    return beta.cdf(x, a, b)\n",
    "\n",
    "def rerank_documents(query: str, documents: list) -> list:\n",
    "    \"\"\"\n",
    "    Use Cohere Rerank API to rerank the search results\n",
    "    \"\"\"\n",
    "    model = \"rerank-v3.5\"\n",
    "    client = cohere.Client(api_key=os.environ[\"CO_API_KEY\"])\n",
    "    decay_rate = 30\n",
    "\n",
    "    reranked_results = client.rerank(model=model, query=query, documents=documents)\n",
    "    results = reranked_results.results\n",
    "    reranked_indices = [result.index for result in results]\n",
    "    reranked_similarity_scores = [result.relevance_score for result in results] # in order of reranked_indices\n",
    "    \n",
    "    # convert back to order of original documents and calculate the chunk values\n",
    "    similarity_scores = [0] * len(documents)\n",
    "    chunk_values = [0] * len(documents)\n",
    "    for i, index in enumerate(reranked_indices):\n",
    "        absolute_relevance_value = transform(reranked_similarity_scores[i])\n",
    "        similarity_scores[index] = absolute_relevance_value\n",
    "        v = np.exp(-i/decay_rate)*absolute_relevance_value # decay the relevance value based on the rank\n",
    "        chunk_values[index] = v\n",
    "\n",
    "    return similarity_scores, chunk_values"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Contextual chunk headers\n",
    "We'll add both a document context and a section context to each chunk."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Document: Nike 10-K FY2023\n",
      "Section: Operating Segments Overview\n",
      "\n",
      "Asia Pacific & Latin America(2) 6,431  5,955  8 %  17 %  5,343  11 %  16 %\n",
      "Global Brand Divisions(3) 58  102  -43 %  -43 %  25  308 %  302 %\n",
      "TOTAL NIKE BRAND $ 48,763 $ 44,436  10 %  16 % $ 42,293  5 %  6 %\n",
      "Converse  2,427  2,346  3 %  8 %  2,205  6 %  7 %\n",
      "Corporate(4) 27  (72)  —  —  40  —  — \n",
      "TOTAL NIKE, INC. REVENUES $ 51,217 $ 46,710  10 %  16 % $ 44,538  5 %  6 %\n",
      "(1) The percent change excluding currency changes represents a non-GAAP financial measure. For further information, see \"Use of Non-GAAP Financial \n",
      "Measures\".\n",
      "(2) For additional information on the transition of our NIKE Brand businesses within our CASA territory to a third-party distributor, see Note 18 —\n"
     ]
    }
   ],
   "source": [
    "if kb_id == \"levels_of_agi\":\n",
    "    document_context = \"Document: Levels of AGI\"\n",
    "elif kb_id == \"nike_10k\":\n",
    "    document_context = \"Document: Nike 10-K FY2023\"\n",
    "else:\n",
    "    document_context = \"Document: Unknown\"\n",
    "\n",
    "documents = []\n",
    "documents_no_context = [] # baseline for comparison\n",
    "for i in range(num_chunks):\n",
    "    section_context = f\"Section: {chunks[i]['section_title']}\"\n",
    "    chunk_text = chunks[i][\"chunk_text\"]\n",
    "    document = f\"{document_context}\\n{section_context}\\n\\n{chunk_text}\"\n",
    "    documents.append(document)\n",
    "    documents_no_context.append(chunk_text)\n",
    "\n",
    "chunk_index_to_inspect = 226\n",
    "query = \"Nike operating segment results\"\n",
    "print (documents[chunk_index_to_inspect])"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Prepending document and section title information adds important context to the chunk. Let's see how much of a difference it makes in the relevance ranking."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Similarity with contextual chunk header: 0.7322965626380898\n",
      "Similarity without contextual chunk header: 0.615422859563519\n"
     ]
    }
   ],
   "source": [
    "# run this chunk through the Cohere Rerank API with and without the context header\n",
    "similarity_scores, chunk_values = rerank_documents(query, [documents[chunk_index_to_inspect], documents_no_context[chunk_index_to_inspect]])\n",
    "\n",
    "print (f\"Similarity with contextual chunk header: {similarity_scores[0]}\")\n",
    "print (f\"Similarity without contextual chunk header: {similarity_scores[1]}\")"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "That's a pretty decent difference.\n",
    "\n",
    "#### Run queries and visualize results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/zach/opt/anaconda3/lib/python3.9/json/decoder.py:353: ResourceWarning: unclosed <ssl.SSLSocket fd=82, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.40.127', 62906), raddr=('34.96.76.122', 443)>\n",
      "  obj, end = self.scan_once(s, idx)\n",
      "ResourceWarning: Enable tracemalloc to get the object allocation traceback\n",
      "/Users/zach/opt/anaconda3/lib/python3.9/site-packages/matplotlib/_api/__init__.py:124: ResourceWarning: unclosed <ssl.SSLSocket fd=83, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.40.127', 62917), raddr=('34.96.76.122', 443)>\n",
      "  for key, val in kwargs.items():\n",
      "ResourceWarning: Enable tracemalloc to get the object allocation traceback\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x7fc0e30fd910>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+kAAAHWCAYAAAALjsguAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB2/ElEQVR4nO3deXxTVfrH8W9aurB1A7qACFhRLGXfpiKgyKaIG24osugoIgqKKzpSqqOIuKCCICjgDKKOuyiy4wKySUXsIApYxIGWCpWWxVJo7u+P/hKbNmmTNm1u0s/79eKlubm5OUlu0vuc85znWAzDMAQAAAAAAHwuyNcNAAAAAAAAxQjSAQAAAAAwCYJ0AAAAAABMgiAdAAAAAACTIEgHAAAAAMAkCNIBAAAAADAJgnQAAAAAAEyCIB0AAAAAAJMgSAcAAAAAwCQI0gHUiJYtW2rUqFFePabFYtGUKVPstxcuXCiLxaK9e/d69XkuvPBCXXjhhV49ZlVt2bJF559/vurXry+LxaJt27b5ukkOWrZsqcsuu6xan8Niseiuu+6q1udwZcqUKbJYLDp06JDHj62u89SZUaNGqUGDBtX+POU9f8uWLX32/Ki8L774QhaLRe+9956vm2I6Vfn+A4A7CNIBVMkPP/yga665Ri1atFB4eLiaNWum/v376+WXX/Z106rNgQMHNGXKFJ8FxqdOndK1116r3NxcvfDCC/r3v/+tFi1a+KQt8L0TJ05oypQp+uKLL3zdFHhgx44dmjJlitudNUuXLnXolPSWxYsXa8aMGV4/LgCg8ur4ugEA/Nc333yjiy66SGeeeaZuu+02xcfH67ffftPGjRv14osv6u6777bv+9NPPykoyLv9gn/++afq1Kn+n7EVK1Y43D5w4IDS0tLUsmVLdezYsdqfv7Q9e/bo119/1bx58/T3v/+9xp8fVXPzzTfrhhtuUFhYmFeOd+LECaWlpUmS6TI+4NqOHTuUlpamCy+80K1sg6VLl2rWrFleD9QXL16sjIwM3XPPPV49LgCg8gjSAVTak08+qcjISG3ZskVRUVEO9+Xk5Djc9lZAUlJ4eLjXj1nSiRMnVK9ePYWGhlbr83jK9t6Wfs/hH4KDgxUcHOzrZgAo4fTp07Jarab7va8Jx48fV/369X3dDAAlkO4OoNL27Nmjtm3bOg0WY2NjHW6XnpNum5e7bt06jR8/Xk2aNFFUVJTGjBmjwsJCHTlyRCNGjFB0dLSio6P14IMPyjAMh2OWnpPuzMcff6zBgweradOmCgsLU2Jiop544gkVFRU57HfhhRcqOTlZW7duVe/evVWvXj098sgj9vtsI5RffPGFunXrJkkaPXq0LBaLLBaLFi5cqNTUVIWEhOj3338v047bb79dUVFRKigoKLe9a9asUa9evVS/fn1FRUXpiiuu0I8//mi/f9SoUerTp48k6dprr5XFYqlw9PTIkSO655571Lx5c4WFhenss8/WtGnTZLVaHfZ79tlndf7556tRo0aqW7euunTp4nI+6qJFi9S9e3fVq1dP0dHR6t27d5mMA0lat26dunfvrvDwcJ111ln617/+VW5bbaxWq1588UW1a9dO4eHhatKkiQYNGqRvv/22zL4fffSRkpOTFRYWprZt22rZsmUO97uaF22bV1qSbZ57Rcd05tdff9XZZ5+t5ORkHTx40OV+zuak2+bwe/p+7d27V02aNJEkpaWl2c/H0t+L/fv368orr1SDBg3UpEkT3X///WW+A1arVTNmzFDbtm0VHh6uuLg4jRkzRn/88UeFr13663MIDw9XcnKyPvzwQ6f7HT9+XPfdd5/9fDz33HP17LPPlvl+SxWfZ65+A6rj98bd98edz3LhwoW69tprJUkXXXSR/XNzNWVh1KhRmjVrlv012/5V5j0t6cILL9Rnn32mX3/91X7M0t8Vq9WqJ598UmeccYbCw8N18cUXa/fu3WWOtWnTJg0aNEiRkZGqV6+e+vTpo/Xr15f7/DYvv/yy2rZta/+cu3btqsWLFzvss3//ft1yyy2Ki4uzfy/nz5/vsE9hYaEmT56sLl26KDIyUvXr11evXr20du1ah/327t0ri8WiZ599VjNmzFBiYqLCwsK0Y8cOSdLOnTt13XXXqUmTJqpbt67OPfdcPfroo2XafeTIEY0aNUpRUVGKjIzU6NGjdeLECbde89y5c5WYmKi6deuqe/fu+vrrr8vUP3FVv8JWL6D0+eLOZ2D73duxY4duvPFGRUdH64ILLtCCBQtksVj03XfflWnrU089peDgYO3fv9+t1wag6hhJB1BpLVq00IYNG5SRkaHk5ORKHePuu+9WfHy80tLStHHjRs2dO1dRUVH65ptvdOaZZ+qpp57S0qVLNX36dCUnJ2vEiBEeHX/hwoVq0KCBJk6cqAYNGmjNmjWaPHmy8vPzNX36dId9Dx8+rEsuuUQ33HCDhg8frri4uDLHO++88/T4449r8uTJuv3229WrVy9J0vnnn68LLrhAjz/+uN555x2HgmaFhYV67733NHTo0HJH/1etWqVLLrlEZ511lqZMmaI///xTL7/8snr27Kn09HS1bNlSY8aMUbNmzfTUU09p/Pjx6tatm9N22pw4cUJ9+vTR/v37NWbMGJ155pn65ptvNGnSJGVlZTnMRX3xxRd1+eWX66abblJhYaHefvttXXvttfr00081ePBg+35paWmaMmWKzj//fD3++OMKDQ3Vpk2btGbNGg0YMMC+3+7du3XNNdfo1ltv1ciRIzV//nyNGjVKXbp0Udu2bV1/aJJuvfVWLVy4UJdccon+/ve/6/Tp0/r666+1ceNGde3a1b7funXr9MEHH+jOO+9Uw4YN9dJLL2no0KHat2+fGjVqVO5zuFKZY+7Zs0d9+/ZVTEyMVq5cqcaNG3v8vJV5v5o0aaLZs2dr7Nixuuqqq3T11VdLktq3b2/fp6ioSAMHDlSPHj307LPPatWqVXruueeUmJiosWPH2vcbM2aMFi5cqNGjR2v8+PHKzMzUzJkz9d1332n9+vUKCQlx2fYVK1Zo6NChSkpK0tSpU3X48GGNHj1aZ5xxhsN+hmHo8ssv19q1a3XrrbeqY8eOWr58uR544AHt379fL7zwgn1fd88zT1Tl98aT96eiz7J3794aP368XnrpJT3yyCM677zzJMn+39LGjBmjAwcOaOXKlfr3v/9d6fe0tEcffVR5eXn63//+Z9+vdKHBp59+WkFBQbr//vuVl5enZ555RjfddJM2bdpk32fNmjW65JJL1KVLF6WmpiooKEgLFixQ37599fXXX6t79+4u2zBv3jyNHz9e11xzjSZMmKCCggJt375dmzZt0o033ihJOnjwoP72t7/ZO9GaNGmizz//XLfeeqvy8/Ptqfr5+fl67bXXNGzYMN122206evSoXn/9dQ0cOFCbN28uMz1pwYIFKigo0O23366wsDDFxMRo+/bt6tWrl0JCQnT77berZcuW2rNnj5YsWaInn3zS4fHXXXedWrVqpalTpyo9PV2vvfaaYmNjNW3aNJevV5Jef/11jRkzRueff77uuece/fLLL7r88ssVExOj5s2bl/tYVzz9DK699lq1bt1aTz31lAzD0DXXXKNx48bpzTffVKdOnRz2ffPNN3XhhReqWbNmlWobgEowAKCSVqxYYQQHBxvBwcFGSkqK8eCDDxrLly83CgsLy+zbokULY+TIkfbbCxYsMCQZAwcONKxWq317SkqKYbFYjDvuuMO+7fTp08YZZ5xh9OnTx+GYkozU1NQyx8zMzLRvO3HiRJm2jBkzxqhXr55RUFBg39anTx9DkjFnzpwy+/fp08fhubds2WJIMhYsWFBm35SUFKNHjx4O2z744ANDkrF27doy+5fUsWNHIzY21jh8+LB92/fff28EBQUZI0aMsG9bu3atIcl49913yz2eYRjGE088YdSvX9/4+eefHbY//PDDRnBwsLFv3z77ttLvVWFhoZGcnGz07dvXvm3Xrl1GUFCQcdVVVxlFRUUO+5f8HFu0aGFIMr766iv7tpycHCMsLMy47777ym3zmjVrDEnG+PHjy9xX8jkkGaGhocbu3bvt277//ntDkvHyyy/bt40cOdJo0aJFmWOlpqYapf8MuntM22N///1348cffzSaNm1qdOvWzcjNzS33tRmG8/O0Ku/X77//Xua7YDNy5EhDkvH44487bO/UqZPRpUsX++2vv/7akGS8+eabDvstW7bM6fbSOnbsaCQkJBhHjhyxb1uxYoUhyeG9/+ijjwxJxj//+U+Hx19zzTWGxWKxv+/unmeuXre3f288eX/c/Szfffddt34XbMaNG1fmfDUM999TVwYPHuz0+2H7nTnvvPOMkydP2re/+OKLhiTjhx9+MAyj+PNo3bp1mff2xIkTRqtWrYz+/fuX+/xXXHGF0bZt23L3ufXWW42EhATj0KFDDttvuOEGIzIy0v7bdfr0aYe2GoZh/PHHH0ZcXJxxyy232LdlZmYakoyIiAgjJyfHYf/evXsbDRs2NH799VeH7SVfm+37X/KYhmEYV111ldGoUaNyX0thYaERGxtrdOzY0aGtc+fONSQ5nHfOfisM46/PxnbuePIZ2No+bNiwMm0bNmyY0bRpU4fvXHp6usu/dwCqD+nuACqtf//+2rBhgy6//HJ9//33euaZZzRw4EA1a9ZMn3zyiVvHuPXWWx3SNnv06CHDMHTrrbfatwUHB6tr16765ZdfPG5j3bp17f9/9OhRHTp0SL169dKJEye0c+dOh33DwsI0evRoj5+jpBEjRmjTpk3as2ePfdubb76p5s2b29PUncnKytK2bds0atQoxcTE2Le3b99e/fv319KlSyvVnnfffVe9evVSdHS0Dh06ZP/Xr18/FRUV6auvvrLvW/K9+uOPP5SXl6devXopPT3dvv2jjz6S1WrV5MmTyxQCLJ06npSUZM80kIpHfc8999wKP8f3339fFotFqampZe4r/Rz9+vVTYmKi/Xb79u0VERFRqXOlMsfMyMhQnz591LJlS61atUrR0dGVft7Kvl/uuOOOOxxu9+rVy+G47777riIjI9W/f3+H86RLly5q0KBBmXThkmzn7siRIxUZGWnf3r9/fyUlJTnsu3TpUgUHB2v8+PEO2++77z4ZhqHPP/9ckmfnmScq+3vj6ftTnZ9lae6+p5U1evRoh3nattdley3btm3Trl27dOONN+rw4cP29+b48eO6+OKL9dVXX5WZWlNSVFSU/ve//2nLli1O7zcMQ++//76GDBkiwzAc3v+BAwcqLy/P/hsVHBxsb6vValVubq5Onz6trl27OvyO2QwdOtQ+XUSSfv/9d3311Ve65ZZbdOaZZzrs6+y8c/a9Onz4sPLz812+3m+//VY5OTm64447HN7XUaNGOXx/PFGZz6B026Xiv18HDhxwOJ/ffPNN1a1bV0OHDq1U2wBUDunuAKqkW7du+uCDD1RYWKjvv/9eH374oV544QVdc8012rZtW5mL9NJKXwjZLlJKp/xFRka6PTe2pP/+97/6xz/+oTVr1pS5cMrLy3O43axZsyoXDbr++ut1zz336M0339TkyZOVl5enTz/9VPfee2+5wcWvv/4qSTr33HPL3Hfeeedp+fLllSrus2vXLm3fvt3hQrSkkgX+Pv30U/3zn//Utm3bdPLkSfv2ku3es2ePgoKCKvxcpbKfrSRFR0dX+Dnu2bNHTZs2deis8PZzeOuYQ4YMUVxcnJYvX17l9cir47VIss/pL++4u3btUl5eXplaEjalC0GWZDt3W7duXea+c8891yE4+vXXX9W0aVM1bNjQYT9bmrftWJ6cZ56o7O+Np+9PdX2Wzrj7nlZW6ddi64iyvZZdu3ZJkkaOHOnyGHl5eS47sB566CGtWrVK3bt319lnn60BAwboxhtvVM+ePSUVB85HjhzR3LlzNXfuXKfHKPn+v/HGG3ruuee0c+dOnTp1yr69VatWZR5Xeput48Hd6VvlvTcRERFOH+Pq+xISEqKzzjrLrectrTKfgbP3o3///kpISNCbb76piy++WFarVW+99ZauuOKKMucXgOpFkA7AK0JDQ9WtWzd169ZN55xzjkaPHq13333X6WhoSa6qXDvbblRQBKm0I0eOqE+fPoqIiNDjjz+uxMREhYeHKz09XQ899FCZkYWSI8mVFR0drcsuu8wepL/33ns6efKkhg8fXuVjV4bValX//v314IMPOr3/nHPOkSR9/fXXuvzyy9W7d2+98sorSkhIUEhIiBYsWFCmgJO7XH22nn6OVX0OV50jpQuneXJMm6FDh+qNN97Qm2++qTFjxlTU3HJV1/vlTiV5q9Wq2NhYvfnmm07vd9XJY1aefrYV/d54+v7UxLlfUyp6Lbbf0enTp7tckrK8DqzzzjtPP/30kz799FMtW7ZM77//vl555RVNnjxZaWlp9uMPHz7cZRBqq8GwaNEijRo1SldeeaUeeOABxcbGKjg4WFOnTnXIbrKp6m9+dX/O7v52VeYzcPbag4ODdeONN2revHl65ZVXtH79eh04cMBnf7+A2owgHYDX2Qp7ZWVl+bQdX3zxhQ4fPqwPPvhAvXv3tm/PzMys0nErSrcdMWKErrjiCm3ZssVehKeiQmktWrSQVLyefGk7d+5U48aNK7VETmJioo4dO6Z+/fqVu9/777+v8PBwLV++3GG5vAULFpQ5ntVq1Y4dO6ptjfjExEQtX75cubm5bo2mVyQ6OlpHjhwps72qI4xS8UVxnTp17EXmbIWualJV0r9tEhMTtWrVKvXs2dPjwMV27tpG80oqfT63aNFCq1at0tGjRx1G5mxTT2zHcvc8c/bZFhYWev23pyrvjyuefm6u9nf3PfVWO0qzTQ2JiIio8HfGlfr16+v666/X9ddfr8LCQl199dV68sknNWnSJDVp0kQNGzZUUVFRhcd/7733dNZZZ+mDDz5weF0VdRbb2EayMzIyKvU63FHy+9K3b1/79lOnTikzM1MdOnSwb7ONfJc+x0v/dnnjM7AZMWKEnnvuOS1ZskSff/65mjRpooEDB1bpmAA8x5x0AJW2du1apyMGtvnTzlK3a5JtlKNkGwsLC/XKK69U6bi2YNlZ4CdJl1xyiRo3bqxp06bpyy+/dGsUIiEhQR07dtQbb7zhcNyMjAytWLFCl156aaXaet1112nDhg1avnx5mfuOHDmi06dPSyp+rywWi8MIzd69e/XRRx85PObKK69UUFCQHn/88TKZCN4aPRo6dKgMw1BaWlqZ+yrzHImJicrLy9P27dvt27KyslwuEeYJi8WiuXPn6pprrtHIkSPdrsXgTfXq1ZPk+nx0x3XXXaeioiI98cQTZe47ffp0uccuee6WnEKycuVK+5JWNpdeeqmKioo0c+ZMh+0vvPCCLBaLLrnkEknun2eJiYkOdRWk4qWtXI2kV1ZV3h9XKvodcXd/d9/T8o5beuqPJ7p06aLExEQ9++yzOnbsWJn7nS1JWdLhw4cdboeGhiopKUmGYejUqVMKDg7W0KFD9f777zsNnkse39lv/qZNm7Rhwwa3XkuTJk3Uu3dvzZ8/X/v27XO4z1u/b127dlWTJk00Z84cFRYW2rcvXLiwzGdrC75LnuNFRUVl0v6r+hmU1L59e7Vv316vvfaa3n//fd1www2qU4cxPaCm8a0DUGl33323Tpw4oauuukpt2rRRYWGhvvnmG73zzjtq2bJllYuwVdX555+v6OhojRw5UuPHj5fFYtG///3vKl9sJSYmKioqSnPmzFHDhg1Vv3599ejRwz7HLyQkRDfccINmzpyp4OBgDRs2zK3jTp8+XZdccolSUlJ066232pdgi4yMrHA9eFceeOABffLJJ7rsssvsS0AdP35cP/zwg9577z3t3btXjRs31uDBg/X8889r0KBBuvHGG5WTk6NZs2bp7LPPdghuzz77bD366KN64okn1KtXL1199dUKCwvTli1b1LRpU02dOrVS7Szpoosu0s0336yXXnpJu3bt0qBBg2S1WvX111/roosucljezh033HCDHnroIV111VUaP368Tpw4odmzZ+ucc85xWkzKU0FBQVq0aJGuvPJKXXfddVq6dKnDCFl1q1u3rpKSkvTOO+/onHPOUUxMjJKTkz1aFrFPnz4aM2aMpk6dqm3btmnAgAEKCQnRrl279O677+rFF1/UNddc4/LxU6dO1eDBg3XBBRfolltuUW5urn3t65JBw5AhQ3TRRRfp0Ucf1d69e9WhQwetWLFCH3/8se655x57UOLuefb3v/9dd9xxh4YOHar+/fvr+++/1/Llyyu1BF51vj/OdOzYUcHBwZo2bZry8vIUFhamvn37upz33qVLF0nS+PHjNXDgQAUH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gwcPOuyzb98+DR48WPXq1VNsbKweeOABnT59uiZfCmqB2bNnq3379oqIiFBERIRSUlL0+eef2+/nXIVZPf3007JYLLrnnnvs2zhfYSZTpkyRxWJx+NemTRv7/f5yvhKkm9A777yjiRMnKjU1Venp6erQoYMGDhyonJwcXzcNtczx48fVoUMHzZo1y+n9zzzzjF566SXNmTNHmzZtUv369TVw4EAVFBTY97npppv03//+VytXrtSnn36qr776SrfffntNvQTUEl9++aXGjRunjRs3auXKlTp16pQGDBig48eP2/e59957tWTJEr377rv68ssvdeDAAV199dX2+4uKijR48GAVFhbqm2++0RtvvKGFCxdq8uTJvnhJCGBnnHGGnn76aW3dulXffvut+vbtqyuuuEL//e9/JXGuwpy2bNmiV199Ve3bt3fYzvkKs2nbtq2ysrLs/9atW2e/z2/OVwOm0717d2PcuHH220VFRUbTpk2NqVOn+rBVqO0kGR9++KH9ttVqNeLj443p06fbtx05csQICwsz3nrrLcMwDGPHjh2GJGPLli32fT7//HPDYrEY+/fvr7G2o/bJyckxJBlffvmlYRjF52ZISIjx7rvv2vf58ccfDUnGhg0bDMMwjKVLlxpBQUFGdna2fZ/Zs2cbERERxsmTJ2v2BaDWiY6ONl577TXOVZjS0aNHjdatWxsrV640+vTpY0yYMMEwDH5bYT6pqalGhw4dnN7nT+crI+kmU1hYqK1bt6pfv372bUFBQerXr582bNjgw5YBjjIzM5Wdne1wrkZGRqpHjx72c3XDhg2KiopS165d7fv069dPQUFB2rRpU423GbVHXl6eJCkmJkaStHXrVp06dcrhfG3Tpo3OPPNMh/O1Xbt2iouLs+8zcOBA5efn20c4AW8rKirS22+/rePHjyslJYVzFaY0btw4DR482OG8lPhthTnt2rVLTZs21VlnnaWbbrpJ+/btk+Rf52udGnsmuOXQoUMqKipyODEkKS4uTjt37vRRq4CysrOzJcnpuWq7Lzs7W7GxsQ7316lTRzExMfZ9AG+zWq2655571LNnTyUnJ0sqPhdDQ0MVFRXlsG/p89XZ+Wy7D/CmH374QSkpKSooKFCDBg304YcfKikpSdu2beNcham8/fbbSk9P15YtW8rcx28rzKZHjx5auHChzj33XGVl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",
      "text/plain": [
       "<Figure size 1200x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Levels of AGI\n",
    "#query = \"Principles for defining levels of AGI\"\n",
    "#query = \"Levels of AGI paper references\"\n",
    "#query = \"CoALA paper references\"\n",
    "#query = \"What are the levels of AGI?\"\n",
    "#query = \"What is Autonomy Level 3\"\n",
    "#query = \"Levels of AGI Introduction section\"\n",
    "#query = \"Use of existing AI benchmarks like Big-bench and HELM\"\n",
    "#query = \"How does autonomy factor into AGI?\"\n",
    "#query = \"What are the levels of AGI?\"\n",
    "\n",
    "# Nike 10-K\n",
    "#query = \"Nike cash flow statement\"\n",
    "#query = \"Nike revenue growth\"\n",
    "#query = \"2023 Nike North America segment results\"\n",
    "#query = \"Nike board of directors\"\n",
    "#query = \"Nike supply chain challenges\"\n",
    "query = \"Nike stock-based compensation expenses\"\n",
    "#query = \"Nike consolidated balance sheet\"\n",
    "#query = \"What is the mission of Nike?\"\n",
    "#query = \"Nike CEO tenure\"\n",
    "\n",
    "similarity_scores, chunk_values = rerank_documents(query, documents)\n",
    "\n",
    "plt.figure(figsize=(12, 5))\n",
    "plt.title(f\"Similarity of each chunk in the document to the search query\")\n",
    "plt.ylim(0, 1)\n",
    "plt.xlabel(\"Chunk index\")\n",
    "plt.ylabel(\"Query-chunk similarity\")\n",
    "plt.scatter(range(len(chunk_values)), chunk_values)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### How to interpret the chunk relevance plot above\n",
    "In the plot above, the x-axis represents the chunk index. The first chunk in the document has index 0, the next chunk has index 1, etc. The y-axis represents the relevance of each chunk to the query. Viewing it this way lets us see how relevant chunks tend to be clustered in one or more sections of a document. \n",
    "\n",
    "Note: the relevance values in this plot are actually a combination of the raw relevance value and the relevance ranks. An exponential decay function is applied to the ranks, and that is then multiplied by the raw relevance value. Using this combination provides a more robust measure of relevance than using just one or the other, at least in most cases.\n",
    "\n",
    "#### What can we do with these clusters of relevant chunks?\n",
    "The core idea is that clusters of relevant chunks, in their original contiguous form, provide much better context to the LLM than individual chunks can. Now for the hard part: how do we actually identify these clusters?\n",
    "\n",
    "If we can calculate chunk values in such a way that the value of a segment is just the sum of the values of its constituent chunks, then finding the optimal segment is a version of the maximum subarray problem, for which a solution can be found relatively easily. How do we define chunk values in such a way? We'll start with the idea that highly relevant chunks are good, and irrelevant chunks are bad. We already have a good measure of chunk relevance, on a scale of 0-1, so all we need to do is subtract a constant threshold value from it. This will turn the chunk value of irrelevant chunks to a negative number, while keeping the values of relevant chunks positive. We call this the `irrelevant_chunk_penalty`. A value around 0.2 seems to work well empirically.\n",
    "\n",
    "# Relevant segment deep dive"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[(397, 412)]\n",
      "[2.3437425496817594]\n",
      "\n",
      "[Document: Nike 10-K FY2023]\n",
      "NOTE 9 — COMMON STOCK AND STOCK-BASED COMPENSATION\n",
      "COMMON STOCK\n",
      "The authorized number of shares of Class A Common Stock, no par value, and Class B Common Stock, no par value, are 400 \n",
      "million and 2,400 million, respectively. Each share of Class A Common Stock is convertible into one share of Class B Common \n",
      "Stock. Voting rights of Class B Common Stock are limited in certain circumstances with respect to the election of directors. There \n",
      "are no differences in the dividend and liquidation preferences or participation rights of the holders of Class A and Class B \n",
      "Common Stock. From time to time, the Company's Board of Directors authorizes share repurchase programs for the repurchase \n",
      "of Class B Common Stock. The value of repurchased shares is deducted from Total shareholders' equity through allocation to \n",
      "Capital in excess of stated value and Retained earnings.\n",
      "NIKE, INC.      74STOCK-BASED COMPENSATION\n",
      "The NIKE, Inc. Stock Incentive Plan (the \"Stock Incentive Plan\") provides for the issuance of up to 798 million previously \n",
      "unissued shares of Class B Common Stock in connection with equity awards granted under the Stock Incentive Plan. The Stock \n",
      "Incentive Plan authorizes the grant of non-statutory stock options, incentive stock options, stock appreciation rights, and stock \n",
      "awards, including restricted stock and restricted stock units. Restricted stock units include both time-vesting restricted stock units \n",
      "(\"RSUs\") as well as performance-based restricted stock units (\"PSUs\"). A committee of the Board of Directors administers the\n",
      "Stock Incentive Plan and has the authority to determine the employees to whom awards will be made, the amount of the awards \n",
      "and the other terms and conditions of the awards. The Company generally grants stock options, restricted stock and restricted \n",
      "stock units on an annual basis. The exercise price for stock options and stock appreciation rights may not be less than the fair \n",
      "market value of the underlying shares on the date of grant. Substantially all awards under the Stock Incentive Plan vest ratably \n",
      "over 4 years of continued employment, with stock options expiring 10 years from the date of grant. \n",
      "The following table summarizes the Company's total stock-based compensation expense recognized in Cost of sales or \n",
      "Operating overhead expense, as applicable: \n",
      " YEAR ENDED MAY 31,\n",
      "(Dollars in millions) 2023 2022 2021\n",
      "Stock options(1)$ 311 $ 297 $ 323 \n",
      "ESPPs  72  60  63 \n",
      "Restricted stock and restricted stock units(1)(2) 372  281  225 \n",
      "TOTAL STOCK-BASED COMPENSATION EXPENSE $ 755 $ 638 $ 611 \n",
      "(1) Expense for stock options includes the expense associated with stock appreciation rights. Accelerated stock option expense is primarily recorded for \n",
      "employees meeting certain retirement eligibility requirements and was $64 million, $57 million and $67 million for the fiscal years ended May 31, 2023, \n",
      "2022 and 2021, respectively. During fiscal 2021, an immaterial amount of accelerated stock option and restricted stock unit expense was also recorded \n",
      "for certain employees impacted by the Company's organizational realignment. For more information, see Note 19 — Restructuring.\n",
      "(2) For the fiscal years ended May 31, 2023 and 2022, expense for restricted stock units includes an immaterial amount of expense for PSUs.\n",
      "The income tax benefit related to stock-based compensation expense was  $71 million, $327 million and $297 million for the fiscal \n",
      "years ended May 31, 2023, 2022 and 2021, respectively, and reported within Income tax expense.\n",
      "STOCK OPTIONS\n",
      "The weighted average fair value per share of stock options granted during the years ended May 31, 2023, 2022 and 2021, \n",
      "computed as of the grant date using the Black-Scholes pricing model, was $31.31, $37.53 and $26.75, respectively. The \n",
      "weighted average assumptions used to estimate these fair values were as follows:\n",
      " YEAR ENDED MAY 31,\n",
      "2023 2022 2021\n",
      "Dividend yield  0.9 %  0.8 %  0.9 %\n",
      "Expected volatility  27.1 %  24.9 %  27.3 %\n",
      "Weighted average expected life (in years) 5.8 5.8 6.0\n",
      "Risk-free interest rate  3.3 %  0.9 %  0.4 %\n",
      "Expected volatilities are based on an analysis of the historical volatility of the Company's common stock, the implied volatility in\n",
      "market traded options on the Company's common stock with a term greater than one year, as well as other factors. The weighted \n",
      "average expected life of options is based on an analysis of historical and expected future exercise patterns. The interest rate is \n",
      "based on the U.S. Treasury (constant maturity) risk-free rate in effect at the date of grant for periods corresponding with the \n",
      "expected term of the options.\n",
      "2023 FORM 10-K   75    The following summarizes the stock option transactions under the plan discussed above: \n",
      "SHARES(1)WEIGHTED AVERAGE \n",
      "OPTION PRICE\n",
      "(In millions)\n",
      "Options outstanding as of May 31, 2022  68.0 $ 88.66 \n",
      "Exercised  (7.5)  57.11 \n",
      "Forfeited  (1.5)  122.93 \n",
      "Granted  12.0  107.44 \n",
      "Options outstanding as of May 31, 2023  71.0 $ 94.40\n",
      "(1) Includes stock appreciation rights transactions.\n",
      "Options exercisable as of May 31, 2023 were 44.7 million and had a weighted average option price of $79.95 per share. The \n",
      "aggregate intrinsic value for options outstanding and exercisable as of May 31, 2023 was $1,380 million and $1,307 million, \n",
      "respectively. The total intrinsic value of the options exercised during the years ended May 31, 2023, 2022 and 2021 was $438 \n",
      "million, $1,742 million and $1,571 million, respectively. The intrinsic value is the amount by which the market value of the \n",
      "underlying stock exceeds the exercise price of the options. The weighted average contractual life remaining for options \n",
      "outstanding and options exercisable as of May 31, 2023 was 5.9 years and 4.5 years, respectively. As of May 31, 2023, the\n",
      "Company had $425 million of unrecognized compensation costs from stock options, net of estimated forfeitures, to be recognized \n",
      "in Cost of sales or Operating overhead expense, as applicable, over a weighted average remaining perio d of 2.5 years.\n",
      "EMPLOYEE STOCK PURCHASE PLANS\n",
      "In addition to the Stock Incentive Plan, the Company gives employees the right to purchase shares at a discount from the market \n",
      "price under ESPPs. Subject to the annual statutory limit, employees are eligible to participate through payroll deductions of up to \n",
      "10% of their compensation. At the end of each six-month offering period, shares are purchased by the participants at 85% of the \n",
      "lower of the fair market value at the beginning or the end of the of fering period. Employees purchased 3.0 million, 2.0 million and \n",
      "2.5 million shares during each of the fiscal years ended May 31, 2023, 2022 and 2021, respectively.\n",
      "RESTRICTED STOCK AND RESTRICTED STOCK UNITS\n",
      "Recipients of restricted stock are entitled to cash dividends and to vote their respective shares throughout the period of \n",
      "restriction. Recipients of restricted stock units, which includes RS Us and PSUs, are entitled to dividend equivalent cash \n",
      "payments upon vesting. The number of shares of restricted stock and restricted stock units vested includes shares of common \n",
      "stock withheld by the Company on behalf of employees to satisfy the minimum statutory tax withholding requirements. \n",
      "The following summarizes the restricted stock and restricted stock units transactions under the plan discussed above: \n",
      "SHARES(1)WEIGHTED AVERAGE \n",
      "GRANT DATE  \n",
      "FAIR VALUE\n",
      "(In millions)\n",
      "Nonvested as of May 31, 2022  6.7 $ 130.88 \n",
      "Vested  (2.2)  114.85 \n",
      "Forfeited  (0.7)  131.10 \n",
      "Granted  4.5  115.56 \n",
      "Nonvested as of May 31, 2023  8.3 $ 126.97 \n",
      "         (1) Includes an immaterial amount of PSU transactions\n",
      "The weighted average fair value per share of restricted stock and restricted stock units granted for the fiscal years ended May 31, \n",
      "2023, 2022 and 2021, computed as of the grant date, was $115.56, $168.04 and $113.84, respectively. During the fiscal years \n",
      "ended May 31, 2023, 2022 and 2021, the aggregate fair value of vested restricted stock and restricted stock units was $250 \n",
      "million, $354 million and $310 million, respectively, computed as of the date of vesting. \n",
      "As of May 31, 2023, the Company had $649 million of unrecognized compensation costs from restricted stock and restricted \n",
      "stock units, net of estimated forfeitures, to be recognized in Cost of sales or Operating overhead expense, as applicable, over a \n",
      "weighted average remaining period of 2.3 years.\n",
      "NIKE, INC.      76NOTE 10 — EARNINGS PER SHARE\n",
      "The following is a reconciliation from basic earnings per common share to diluted earnings per common share. The computations \n",
      "of diluted earnings per common share excluded restricted stock, restricted stock units and options, including shares under \n",
      "ESPPs, to purchase an estimated additional 31.7 million, 9.4 million and 11.3 million shares of common stock outstanding for the \n",
      "fiscal years ended May 31, 2023, 2022 and 2021, respectively, because the awards were assumed to be anti-dilutive.\n",
      " YEAR ENDED MAY 31,\n",
      "(In millions, except per share data) 2023 2022 2021\n",
      "Net income available to common stockholders $ 5,070 $ 6,046 $ 5,727 \n",
      "Determination of shares:\n",
      "Weighted average common shares outstanding  1,551.6  1,578.8  1,573.0 \n",
      "Assumed conversion of dilutive stock options and awards  18.2  32.0  36.4 \n",
      "DILUTED WEIGHTED AVERAGE COMMON SHARES OUTSTANDING  1,569.8  1,610.8  1,609.4 \n",
      "Earnings per common share:\n",
      "Basic $ 3.27 $ 3.83 $ 3.64 \n",
      "Diluted $ 3.23 $ 3.75 $ 3.56 \n",
      "NOTE 11 — BENEFIT PLANS\n",
      "The Company has a qualified 401(k) Savings and Profit Sharing Plan, in which all U.S. employees are able to participate. The \n",
      "Company matches a portion of employee contributions to the savings plan. Company contributions to the savings plan were $136 \n",
      "million, $126 million and $110 million and included in Cost of sales or Operating overhead expense, as applicable, for the fiscal \n",
      "years ended May 31, 2023, 2022 and 2021, respectively. \n",
      "The Company also has a Long-Term Incentive Plan (\"LTIP\") adopted by the Board of Directors and approved by shareholders in \n",
      "September 1997, which has been amended from time to time. The Company recognized an immaterial amount of Operating\n",
      "overhead expense related to cash awards under the LTIP during the years ended May 31, 2023, 2022 and 2021. During the fiscal \n",
      "years ended May 31, 2023 and 2022, under the Stock Incentive Plan, the Company granted PSUs which replaced cash-based \n",
      "long-term incentive awards historically granted under the Company's LTIP. Refer to Note 9 — Common Stock and Stock-Based \n",
      "Compensation for further information related to PSUs.\n",
      "The Company allows certain highly compensated employees and non-employee directors of the Company to defer compensation \n",
      "under a nonqualified deferred compensation plan. A rabbi trust was established to fund the Company's nonqualified deferred \n",
      "compensation plan obligation. The assets in the rabbi trust of approximately $875 million and $876 million as of May 31, 2023\n",
      "and 2022, respectively, primarily consist of company owned life insurance policies recorded at their cash surrender value and are \n",
      "classified in Deferred income taxes and other assets on the Consolidated B alance Sheets. Deferred compensation plan liabilities \n",
      "were $897 million and $890 million as of May 31, 2023 and 2022, respectively, and primarily classified in Deferred income taxes \n",
      "and other liabilities on the Consolidated Balance Sheets.\n",
      "The Company has pension plans in various countries worldwide. The pension plans are only available to local employees and are \n",
      "generally government mandated. The liability related to the unfunded pension liabilities of the plans was $29 million and $30\n",
      "\n",
      "\n",
      "---\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# be sure you're using the Nike 10-K KB for these next few cells, as we'll be focusing on a single example query for that document\n",
    "\n",
    "query = \"Nike stock-based compensation expenses\"\n",
    "similarity_scores, chunk_values = rerank_documents(query, documents)\n",
    "\n",
    "irrelevant_chunk_penalty = 0.2\n",
    "all_relevance_values = [[v - irrelevant_chunk_penalty for v in chunk_values]]\n",
    "document_splits = []\n",
    "max_length = 30\n",
    "overall_max_length = 50\n",
    "minimum_value = 0.5\n",
    "\n",
    "# get_best_segments solves a constrained version of the maximum sum subarray problem\n",
    "best_segments, scores = get_best_segments(all_relevance_values, document_splits, max_length, overall_max_length, minimum_value)\n",
    "\n",
    "print (best_segments)\n",
    "print (scores)\n",
    "print ()\n",
    "\n",
    "# print the best segments\n",
    "for segment_start, segment_end in best_segments:\n",
    "    # concatenate the text of the chunks in the segment\n",
    "    segment_text = f\"[{document_context}]\\n\"\n",
    "    for i in range(segment_start, segment_end):\n",
    "        chunk_text = chunks[i][\"chunk_text\"]\n",
    "        segment_text += chunk_text + \"\\n\"\n",
    "\n",
    "    print (segment_text)\n",
    "    print (\"\\n---\\n\")"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's zoom in to the best segment and see what the chunk relevance values look like. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/zach/opt/anaconda3/lib/python3.9/site-packages/matplotlib/cbook.py:2096: ResourceWarning: unclosed <ssl.SSLSocket fd=83, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.40.127', 62929), raddr=('34.96.76.122', 443)>\n",
      "  for attr, val in kwargs.items():\n",
      "ResourceWarning: Enable tracemalloc to get the object allocation traceback\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x7fc090a800d0>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+kAAAHWCAYAAAALjsguAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABYXElEQVR4nO3deVxUZf//8fcMsrjAACpCSorLneK+pDdpWW5wZ5RtmmUubd/MyjK707yVsG+prVaarWpli+WdlVm4oGWmiWlmqJULphmIRgJqIDLX7w9/zNcR0BkdmBFez8eDx8O5znXOfA4XKu+5zjmXxRhjBAAAAAAAvM7q7QIAAAAAAMAJhHQAAAAAAHwEIR0AAAAAAB9BSAcAAAAAwEcQ0gEAAAAA8BGEdAAAAAAAfAQhHQAAAAAAH0FIBwAAAADARxDSAQAAAADwEYR0AIDDV199JYvFoq+++srbpVRpVen7/PTTT6tp06by8/NThw4d3N6/5HuxYMECzxfnhfcBAOBcEdIB4Dw1d+5cWSwWx1eNGjXUsGFDDR8+XPv27fN2eagGli5dqn//+9/q3r275syZoyeffLLcvu+9956mT59eecX5iOp63udqzZo1euyxx3To0CFvlwIAla6GtwsAAJybyZMnKyYmRgUFBfruu+80d+5crV69Wunp6QoKCvJ2eajCVqxYIavVqjfffFMBAQGn7fvee+8pPT1dDzzwQOUU5yOq63mfqzVr1ig5OVnDhw9XaGiot8sBgEpFSAeA89y//vUvdenSRZJ0xx13qF69epo2bZo+++wzDRw40MvVoSrLzs5WzZo1zxjQAQCA67jcHQCqmEsvvVSStHPnTqf2n3/+WTfccIPCw8MVFBSkLl266LPPPnPpmOvWrVNCQoJsNptq1aqlnj176ttvv3VsX7BggSwWi77++utS+7766quyWCxKT0+XJG3evFnDhw9X06ZNFRQUpMjISN122236888/nfZ77LHHZLFYtGPHDsdsms1m04gRI3T06NFS7zNv3jx17dpVtWrVUlhYmC677DItXbrUqc+XX36pSy+9VLVr11ZwcLD69++vLVu2nPbcv//+e1ksFr311lulti1ZskQWi0Wff/65JOm3337TPffco4suukg1a9ZU3bp1deONN2r37t2nfQ9JatKkiYYPH16q/fLLL9fll1/u1FZYWKikpCQ1b95cgYGBio6O1r///W8VFhY69Vu2bJl69Oih0NBQ1alTRxdddJEeffTRM9Zy/PhxPf7442rWrJkCAwPVpEkTPfroo07Ht1gsmjNnjo4cOeK45WLu3LllHu/yyy/X4sWL9dtvvzn6NmnSxKmP3W7XE088oUaNGikoKEi9e/fWjh07Sh3rTD+LZ1JcXKxHH31UkZGRql27tq6++mrt3bv3rN4nPz9fDzzwgJo0aaLAwEBFRESob9++2rhxo8vnfSpXxszV8f/77791//33q169egoODtbVV1+tffv2yWKx6LHHHnP0K/m79uuvv2rIkCGy2WyqX7++Jk6cKGOM9u7dq2uuuUYhISGKjIzUs88+W6puV2uyWCy699579cknn6hNmzYKDAxU69atlZKS4lTPww8/LEmKiYlxfO9c+XsEAFUBM+kAUMWU/CIbFhbmaNuyZYu6d++uhg0baty4capdu7Y+/PBDDRgwQP/973917bXXlnu8FStW6F//+pc6d+6spKQkWa1WzZkzR7169dI333yjrl27qn///qpTp44+/PBD9ezZ02n/+fPnq3Xr1mrTpo2kEyFk165dGjFihCIjI7Vlyxa99tpr2rJli7777jtZLBan/QcOHKiYmBhNmTJFGzdu1BtvvKGIiAhNmzbN0Sc5OVmPPfaYLrnkEk2ePFkBAQFat26dVqxYoX79+kmS3nnnHQ0bNkzx8fGaNm2ajh49qlmzZqlHjx764Ycfyg1PXbp0UdOmTfXhhx9q2LBhpc4tLCxM8fHxkqT169drzZo1uummm9SoUSPt3r1bs2bN0uWXX66tW7eqVq1apxk519jtdl199dVavXq17rrrLrVq1Uo//fSTnn/+ef3666/65JNPJJ0Y86uuukrt2rXT5MmTFRgYqB07drgUaO+44w699dZbuuGGG/TQQw9p3bp1mjJlirZt26aFCxdKOvH9fO2115SWlqY33nhDknTJJZeUebwJEyYoNzdXv//+u55//nlJUp06dZz6TJ06VVarVWPHjlVubq6eeuop3XLLLVq3bp2jjys/i2fyxBNPyGKx6JFHHlF2dramT5+uPn36aNOmTapZs6Zb73P33XdrwYIFuvfeexUbG6s///xTq1ev1rZt29SpUyeXzvtkroyZq+MvScOHD9eHH36oW2+9Vf/85z/19ddfq3///uW+/6BBg9SqVStNnTpVixcv1v/+7/8qPDxcr776qnr16qVp06bp3Xff1dixY3XxxRfrsssuc7smSVq9erU+/vhj3XPPPQoODtaLL76o66+/Xnv27FHdunV13XXX6ddff9X777+v559/XvXq1ZMk1a9f/4zjCwBVggEAnJfmzJljJJnly5ebAwcOmL1795oFCxaY+vXrm8DAQLN3715H3969e5u2bduagoICR5vdbjeXXHKJadGihaNt5cqVRpJZuXKlo0+LFi1MfHy8sdvtjn5Hjx41MTExpm/fvo62wYMHm4iICHP8+HFHW2ZmprFarWby5MlO+57q/fffN5LMqlWrHG1JSUlGkrntttuc+l577bWmbt26jtfbt283VqvVXHvttaa4uNipb0nN+fn5JjQ01Nx5551O27OysozNZivVfqrx48cbf39/k5OT42grLCw0oaGhTvWVdW5r1641kszbb7/taDv1+2yMMY0bNzbDhg0rtX/Pnj1Nz549Ha/feecdY7VazTfffOPU75VXXjGSzLfffmuMMeb55583ksyBAwdOe26n2rRpk5Fk7rjjDqf2sWPHGklmxYoVjrZhw4aZ2rVru3Tc/v37m8aNG5dqL/letGrVyhQWFjraX3jhBSPJ/PTTT8YY934Wy1LyPg0bNjR5eXmO9g8//NBIMi+88ILb72Oz2cyoUaPO6rzL4sqYuTr+GzZsMJLMAw884NRv+PDhRpJJSkpytJX8XbvrrrscbcePHzeNGjUyFovFTJ061dH+119/mZo1azr9rLpakzHGSDIBAQFmx44djrYff/zRSDIvvfSSo+3pp582kkxGRka53wsAqKq43B0AznN9+vRR/fr1FR0drRtuuEG1a9fWZ599pkaNGkmScnJytGLFCg0cOFD5+fk6ePCgDh48qD///FPx8fHavn17uU+D37Rpk7Zv366bb75Zf/75p2PfI0eOqHfv3lq1apXsdrukE7Nw2dnZTsuKLViwQHa7XYMGDXK0lcxWSlJBQYEOHjyof/7zn5LkuEz4ZHfffbfT60svvVR//vmn8vLyJEmffPKJ7Ha7Jk2aJKvV+b+1kln5ZcuW6dChQxo8eLDjHA4ePCg/Pz9169ZNK1euPO33eNCgQSoqKtLHH3/saFu6dKkOHTpU7rkVFRXpzz//VPPmzRUaGlrmuZ2Njz76SK1atVLLli2dzqVXr16S5DiXkodtffrpp44xcsUXX3whSRozZoxT+0MPPSRJWrx48bmeQplGjBjhdG97yW0bu3btkuTez+LpDB06VMHBwY7XN9xwg6Kiohzn7c77hIaGat26dfrjjz888j1wZcxcHf+Sy8fvuecep/3vu+++ct//jjvucPzZz89PXbp0kTFGt99+u1ONF110kWNc3KmpRJ8+fdSsWTPH63bt2ikkJMTpmABQnXG5OwCc52bOnKl//OMfys3N1ezZs7Vq1SoFBgY6tu/YsUPGGE2cOFETJ04s8xjZ2dlq2LBhqfbt27dLUqnLvE+Wm5ursLAwx/278+fPV+/evSWduBy8Q4cO+sc//uHon5OTo+TkZH3wwQfKzs4udaxTXXjhhU6vSy7j/+uvvxQSEqKdO3fKarUqNja23BpLzqMkNJwqJCSk3H0lqX379mrZsqXmz5/vCCzz589XvXr1nI75999/a8qUKZozZ4727dsnY8xpz+1sbN++Xdu2bSv30t+S7+mgQYP0xhtv6I477tC4cePUu3dvXXfddbrhhhtKfZhxst9++01Wq1XNmzd3ao+MjFRoaKh+++03j5zHqU43zpJ7P4un06JFC6fXFotFzZs3d9wm4s77PPXUUxo2bJiio6PVuXNnXXnllRo6dKiaNm162hrK48qYuTr+JeMYExPjtP3UcT3ZqWNgs9kUFBTkuNz85PaTnyHhak3lvY90YrxLxhoAqjtCOgCc57p27ep4uvuAAQPUo0cP3Xzzzfrll19Up04dx4zc2LFjHfdOn6q8X9xL9n366afVoUOHMvuU3GMbGBioAQMGaOHChXr55Ze1f/9+ffvtt6XWzh44cKDWrFmjhx9+WB06dHDUmJCQUObsoZ+fX5nve3IAPpOS477zzjuKjIwstb1GjTP/dzho0CA98cQTOnjwoIKDg/XZZ59p8ODBTvved999mjNnjh544AHFxcXJZrPJYrHopptuOuMs76n34pcoLi52+h7Y7Xa1bdtWzz33XJn9o6OjJZ2Y1V+1apVWrlypxYsXKyUlRfPnz1evXr20dOnScr+vZ6qnopxpnN35WTwX7rzPwIEDdemll2rhwoVaunSpnn76aU2bNk0ff/yx/vWvf7n93q6MmavjfzbKGgNX/v65W5Mn/k4DQFVGSAeAKsTPz09TpkzRFVdcoRkzZmjcuHGOWT1/f3/16dPHreOVXJIaEhLi0r6DBg3SW2+9pdTUVG3btk3GGKfLwf/66y+lpqYqOTlZkyZNcrSXzF6ejWbNmslut2vr1q3lhqqS84iIiHD7e1Bi0KBBSk5O1n//+181aNBAeXl5uummm5z6LFiwQMOGDXN6+nVBQYEOHTp0xuOHhYWV2e+3335zmplt1qyZfvzxR/Xu3fuMQdpqtap3797q3bu3nnvuOT355JOaMGGCVq5cWe73oXHjxrLb7dq+fbtatWrlaN+/f78OHTqkxo0bn/FcynKuod/dn8XynPqzZozRjh071K5du7N6n6ioKN1zzz265557lJ2drU6dOumJJ55whHR3z/tMY+bq+JeMY0ZGhtPVA2U9Mf9cufMz6arK/pAIAHwJ96QDQBVz+eWXq2vXrpo+fboKCgoUERGhyy+/XK+++qoyMzNL9T9w4EC5x+rcubOaNWumZ555RocPHz7jvn369FF4eLjmz5+v+fPnq2vXrk6X25bMoJ06YzZ9+nR3TtHJgAEDZLVaNXny5FKz1SXvEx8fr5CQED355JMqKio643mUpVWrVmrbtq3j3KKiohxPty7h5+dX6txeeuklFRcXn/H4zZo103fffadjx4452j7//PNSy4MNHDhQ+/bt0+uvv17qGH///beOHDki6cRtBacq+RDj1GWxTnbllVdKKj0mJbOkp3s6+OnUrl37nC75d/dnsTxvv/228vPzHa8XLFigzMxMR6h29X2Ki4tLnU9ERIQuuOACp++vO+ftypi5Ov4lV828/PLLTn1eeukll2pxh6s1uaN27dqS5NIHXABQ1TCTDgBV0MMPP6wbb7xRc+fO1d13362ZM2eqR48eatu2re688041bdpU+/fv19q1a/X777/rxx9/LPM4VqtVb7zxhv71r3+pdevWGjFihBo2bKh9+/Zp5cqVCgkJ0aJFixz9/f39dd111+mDDz7QkSNH9MwzzzgdLyQkRJdddpmeeuopFRUVqWHDhlq6dKkyMjLO+lybN2+uCRMm6PHHH9ell16q6667ToGBgVq/fr0uuOACTZkyRSEhIZo1a5ZuvfVWderUSTfddJPq16+vPXv2aPHixerevbtmzJhxxvcaNGiQJk2apKCgIN1+++2l7u2+6qqr9M4778hmsyk2NlZr167V8uXLVbdu3TMe+4477tCCBQuUkJCggQMHaufOnZo3b57TA7Yk6dZbb9WHH36ou+++WytXrlT37t1VXFysn3/+WR9++KGWLFmiLl26aPLkyVq1apX69++vxo0bKzs7Wy+//LIaNWqkHj16lFtH+/btNWzYML322ms6dOiQevbsqbS0NL311lsaMGCArrjiijOeS1k6d+6s+fPna8yYMbr44otVp04dJSYmury/uz+L5QkPD1ePHj00YsQI7d+/X9OnT1fz5s115513uvU++fn5atSokW644Qa1b99ederU0fLly7V+/XqnKyncOW9XxszV8e/cubOuv/56TZ8+XX/++adjCbZff/1Vkmdnql2tyR2dO3eWdGL5vptuukn+/v5KTEx0hHcAqNK881B5AMC5KlmCbf369aW2FRcXm2bNmplmzZo5lkTbuXOnGTp0qImMjDT+/v6mYcOG5qqrrjILFixw7FfW0mDGGPPDDz+Y6667ztStW9cEBgaaxo0bm4EDB5rU1NRS771s2TIjyVgsFqdl4Er8/vvv5tprrzWhoaHGZrOZG2+80fzxxx/lLgt16nJUJed96tJMs2fPNh07djSBgYEmLCzM9OzZ0yxbtsypz8qVK018fLyx2WwmKCjINGvWzAwfPtx8//33ZX6PT7V9+3YjyUgyq1evLrX9r7/+MiNGjDD16tUzderUMfHx8ebnn38utbxaed/nZ5991jRs2NAEBgaa7t27m++//77UEmzGGHPs2DEzbdo007p1a8f5du7c2SQnJ5vc3FxjjDGpqanmmmuuMRdccIEJCAgwF1xwgRk8eLD59ddfz3ieRUVFJjk52cTExBh/f38THR1txo8f77SEnzHuLcF2+PBhc/PNN5vQ0FAjybEsWcn34qOPPnLqn5GRYSSZOXPmOLW787N4spL3ef/998348eNNRESEqVmzpunfv7/57bffSvU/0/sUFhaahx9+2LRv394EBweb2rVrm/bt25uXX37ZpfMui6tj5sr4G2PMkSNHzKhRo0x4eLipU6eOGTBggPnll1+MJKdl1cr7u1be+Pbs2dO0bt36rGqSVOaydWUtQfj444+bhg0bGqvVynJsAKoVizE8pQMAAKA62LRpkzp27Kh58+bplltu8XY5AIAycE86AABAFfT333+Xaps+fbqsVmup5ykAAHwH96QDAABUQU899ZQ2bNigK664QjVq1NCXX36pL7/8Unfdddc5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d999VxF1AQAAAABQ7bgd0qdPn64//vhDc+bMUXZ2ti677DLFxsbqmWee0f79+yuiRgAAAAAAqoWzuie9Ro0auu666/Tpp5/q999/180336yJEycqOjpaAwYM0IoVKzxdJwAAAAAAVd45PTguLS1NSUlJevbZZxUREaHx48erXr16uuqqqzR27FhP1QgAAAAAQLVgMcYYd3bIzs7WO++8ozlz5mj79u1KTEzUHXfcofj4eFksFknS6tWrlZCQoMOHD1dI0eciLy9PNptNubm5CgkJ8XY5AAAAAIAqzp0cWsPdgzdq1EjNmjXTbbfdpuHDh6t+/fql+rRr104XX3yxu4cGAAAAAKBaczukp6am6tJLLz1tn5CQEK1cufKsiwIAAAAAoDpy+570pKQkHTp0qFR7Xl6eevXq5YmaAAAAAAColtwO6V9//bWOHTtWqr2goEDffPONR4oCAAAAAKA6cvly982bN0uSjDHaunWrsrKyHNuKi4uVkpKihg0ber5CAAAAAACqCZdDeocOHWSxWGSxWMq8rL1mzZp66aWXPFocAAAAAADVicshPSMjQ8YYNW3aVGlpaU5PdQ8ICFBERIT8/PwqpEgAAAAAAKoDl0N648aNJUl2u73CigEAAAAAoDpzKaR/9tln+te//iV/f3999tlnp+179dVXe6QwAAAAAACqG4sxxpypk9VqVVZWliIiImS1lv9AeIvFouLiYo8W6Gl5eXmy2WzKzc1VSEiIt8sBAAAAAFRx7uRQl2bST77EncvdAQAAAACoGG6tk15UVKTevXtr+/btFVUPAAAAAADVllsh3d/f37FeOgAAAAAA8Cy3QrokDRkyRG+++WZF1AIAAAAAQLXm8hJsJY4fP67Zs2dr+fLl6ty5s2rXru20/bnnnvNYcQAAAAAAVCduh/T09HR16tRJkvTrr786bbNYLJ6pCgAAAACAasjtkL5y5cqKqAMAAAAAgGrP7XvSAQAAAABAxXB7Jl2Svv/+e3344Yfas2ePjh075rTt448/9khhAAAAAABUN27PpH/wwQe65JJLtG3bNi1cuFBFRUXasmWLVqxYIZvNVhE1AlVOsd1o7c4/9emmfVq7808V2423SwIAAADgA9yeSX/yySf1/PPPa9SoUQoODtYLL7ygmJgY/c///I+ioqIqokagSklJz1Tyoq3KzC1wtEXZgpSU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448/vHAGOJNTxzgzM9P88MMP5vXXX3esjPTDDz+YP//809EnISHBdOzY0axbt86sXr3atGjRwgwePNgL1eNMmElHhcrOztbQoUOVmZkpm82mdu3aacmSJerbt6+kE5/kjh8/Xjk5OWrSpIkmTJigBx980LF/vXr1lJKSogkTJqhXr14qKipS69at9emnn6p9+/beOi244fnnn5fVatX111+vwsJCxcfH6+WXX3Zs9/Pz0+eff66RI0cqLi5OtWvX1rBhwzR58mQvVg13nGmMFyxYoAMHDmjevHmaN2+eo71x48bavXu3FyqGu840xjj/uTLGb7/9th588EH1799fVqtVPXv2VEpKivz9/b1UNVx1pvFt2bKlFi1apOTkZMXFxclqtapjx45KSUlRVFSUFyuHq1555RUlJyc7Xl922WWSpDlz5mj48OGSpHfffVf33nuvevfu7fh5ePHFF71RLs7AYowx3i4CAAAAAADwdHcAAAAAAHwGIR0AAAAAAB9BSAcAAAAAwEcQ0gEAAAAA8BGEdAAAAAAAfAQhHQAAAAAAH0FIBwAAAADARxDSAQAAAADwEYR0AADOIxaLRZ988kmFv8/ll1+uBx54wOX+X331lSwWiw4dOnRO7zt8+HANGDDgnI4BAMD5jJAOAICPyMrK0n333aemTZsqMDBQ0dHRSkxMVGpqqrdLO6NLLrlEmZmZstls3i4FAIDzWg1vFwAAAKTdu3ere/fuCg0N1dNPP622bduqqKhIS5Ys0ahRo/Tzzz97u8TTCggIUGRkpLfLAADgvMdMOgAAPuCee+6RxWJRWlqarr/+ev3jH/9Q69atNWbMGH333XdOfQ8ePKhrr71WtWrVUosWLfTZZ585ts2dO1ehoaFO/T/55BNZLBbH68cee0wdOnTQO++8oyZNmshms+mmm25Sfn5+ufUtXrxYNptN7777bpnbT73cvaSOJUuWqFWrVqpTp44SEhKUmZnp2Ke4uFhjxoxRaGio6tatq3//+98yxjgd1263a8qUKYqJiVHNmjXVvn17LViwQJJkjFGfPn0UHx/v2C8nJ0eNGjXSpEmTyj0XAAB8GSEdAAAvy8nJUUpKikaNGqXatWuX2n5q6E5OTtbAgQO1efNmXXnllbrllluUk5Pj1nvu3LlTn3zyiT7//HN9/vnn+vrrrzV16tQy+7733nsaPHiw3n33Xd1yyy0uv8fRo0f1zDPP6J133tGqVau0Z88ejR071rH92Wef1dy5czV79mytXr1aOTk5WrhwodMxpkyZorfffluvvPKKtmzZogcffFBDhgzR119/LYvForfeekvr16/Xiy++KEm6++671bBhQ0I6AOC8xeXuAAB42Y4dO2SMUcuWLV3qP3z4cA0ePFiS9OSTT+rFF19UWlqaEhISXH5Pu92uuXPnKjg4WJJ06623KjU1VU888YRTv5kzZ2rChAlatGiRevbs6fLxJamoqEivvPKKmjVrJkm69957NXnyZMf26dOna/z48bruuuskSa+88oqWLFni2F5YWKgnn3xSy5cvV1xcnCSpadOmWr16tV599VX17NlTDRs21KuvvqqhQ4cqKytLX3zxhX744QfVqMGvOACA8xP/gwEA4GWnXuJ9Ju3atXP8uXbt2goJCVF2drZbx2jSpIkjoEtSVFRUqWMsWLBA2dnZ+vbbb3XxxRe7dXxJqlWrliOgn/oeubm5yszMVLdu3Rzba9SooS5duji+Hzt27NDRo0fVt29fp+MeO3ZMHTt2dLy+8cYbtXDhQk2dOlWzZs1SixYt3K4VAABfQUgHAMDLWrRoIYvF4vLD4fz9/Z1eWywW2e12SZLVai0V+ouKitw6RomOHTtq48aNmj17trp06eJ0X/vZ1unOBxKHDx+WdOJ++IYNGzptCwwMdPz56NGj2rBhg/z8/LR9+3a3agQAwNdwTzoAAF4WHh6u+Ph4zZw5U0eOHCm13Z21x+vXr6/8/Hyn42zatOms6mrWrJlWrlypTz/9VPfdd99ZHaM8NptNUVFRWrdunaPt+PHj2rBhg+N1bGysAgMDtWfPHjVv3tzpKzo62tHvoYcektVq1ZdffqkXX3xRK1as8GitAABUJmbSAQDwATNnzlT37t3VtWtXTZ48We3atdPx48e1bNkyzZo1S9u2bXPpON26dVOtWrX06KOP6v7779e6des0d+7cs67rH//4h1auXKnLL79cNWrU0PTp08/6WKcaPXq0pk6dqhYtWqhly5Z67rnnnD6QCA4O1tixY/Xggw/KbrerR48eys3N1bfffquQkBANGzZMixcv1uzZs7V27Vp16tRJDz/8sIYNG6bNmzcrLCzMY7UCAFBZmEkHAMAHNG3aVBs3btQVV1yhhx56SG3atFHfvn2VmpqqWbNmuXyc8PBwzZs3T1988YXatm2r999/X4899tg51XbRRRdpxYoVev/99/XQQw+d07FO9tBDD+nWW2/VsGHDFBcXp+DgYF177bVOfR5//HFNnDhRU6ZMUatWrZSQkKDFixcrJiZGBw4c0O23367HHntMnTp1knTiyfcNGjTQ3Xff7bE6AQCoTBbj7tNqAAAAAABAhWAmHQAAAAAAH0FIBwAAAADARxDSAQAAAADwEYR0AAAAAAB8BCEdAAAAAAAfQUgHAAAAAMBHENIBAAAAAPARhHQAAAAAAHwEIR0AAAAAAB9BSAcAAAAAwEcQ0gEAAAAA8BH/DxfQFEd2xhGaAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 1200x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot the relevance values of the best segment\n",
    "best_segment_chunk_indexes = list(range(best_segments[0][0], best_segments[0][1]))\n",
    "best_segment_chunk_values = chunk_values[best_segments[0][0]:best_segments[0][1]]\n",
    "\n",
    "plt.figure(figsize=(12, 5))\n",
    "plt.title(f\"Relevance values of the best segment\")\n",
    "plt.ylim(0, 1)\n",
    "plt.xlabel(\"Chunk index\")\n",
    "plt.ylabel(\"Query-chunk similarity\")\n",
    "plt.scatter(best_segment_chunk_indexes, best_segment_chunk_values)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You'll notice that a few of the chunks (especially 402-404) aren't particularly relevant, but they're surrounded by relevant chunks, so we include them in the segment for continuity."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Chunk index: 397 - Relevance value: 0.2737437434522127\n",
      "NOTE 9 — COMMON STOCK AND STOCK-BASED COMPENSATION\n",
      "COMMON STOCK\n",
      "The authorized number of shares of Class A Common Stock, no par value, and Class B Common Stock, no par value, are 400 \n",
      "million and 2,400 million, respectively. Each share of Class A Common Stock is convertible into one share of Class B Common \n",
      "Stock. Voting rights of Class B Common Stock are limited in certain circumstances with respect to the election of directors. There \n",
      "are no differences in the dividend and liquidation preferences or participation rights of the holders of Class A and Class B \n",
      "Common Stock. From time to time, the Company's Board of Directors authorizes share repurchase programs for the repurchase \n",
      "of Class B Common Stock. The value of repurchased shares is deducted from Total shareholders' equity through allocation to \n",
      "Capital in excess of stated value and Retained earnings.\n",
      "\n",
      "---\n",
      "\n",
      "Chunk index: 398 - Relevance value: 0.49520135613130917\n",
      "NIKE, INC.      74STOCK-BASED COMPENSATION\n",
      "The NIKE, Inc. Stock Incentive Plan (the \"Stock Incentive Plan\") provides for the issuance of up to 798 million previously \n",
      "unissued shares of Class B Common Stock in connection with equity awards granted under the Stock Incentive Plan. The Stock \n",
      "Incentive Plan authorizes the grant of non-statutory stock options, incentive stock options, stock appreciation rights, and stock \n",
      "awards, including restricted stock and restricted stock units. Restricted stock units include both time-vesting restricted stock units \n",
      "(\"RSUs\") as well as performance-based restricted stock units (\"PSUs\"). A committee of the Board of Directors administers the\n",
      "\n",
      "---\n",
      "\n",
      "Chunk index: 399 - Relevance value: 0.6203245062078602\n",
      "Stock Incentive Plan and has the authority to determine the employees to whom awards will be made, the amount of the awards \n",
      "and the other terms and conditions of the awards. The Company generally grants stock options, restricted stock and restricted \n",
      "stock units on an annual basis. The exercise price for stock options and stock appreciation rights may not be less than the fair \n",
      "market value of the underlying shares on the date of grant. Substantially all awards under the Stock Incentive Plan vest ratably \n",
      "over 4 years of continued employment, with stock options expiring 10 years from the date of grant. \n",
      "The following table summarizes the Company's total stock-based compensation expense recognized in Cost of sales or \n",
      "Operating overhead expense, as applicable: \n",
      " YEAR ENDED MAY 31,\n",
      "\n",
      "---\n",
      "\n",
      "Chunk index: 400 - Relevance value: 0.8179933635835989\n",
      "(Dollars in millions) 2023 2022 2021\n",
      "Stock options(1)$ 311 $ 297 $ 323 \n",
      "ESPPs  72  60  63 \n",
      "Restricted stock and restricted stock units(1)(2) 372  281  225 \n",
      "TOTAL STOCK-BASED COMPENSATION EXPENSE $ 755 $ 638 $ 611 \n",
      "(1) Expense for stock options includes the expense associated with stock appreciation rights. Accelerated stock option expense is primarily recorded for \n",
      "employees meeting certain retirement eligibility requirements and was $64 million, $57 million and $67 million for the fiscal years ended May 31, 2023, \n",
      "2022 and 2021, respectively. During fiscal 2021, an immaterial amount of accelerated stock option and restricted stock unit expense was also recorded \n",
      "for certain employees impacted by the Company's organizational realignment. For more information, see Note 19 — Restructuring.\n",
      "\n",
      "---\n",
      "\n",
      "Chunk index: 401 - Relevance value: 0.7584171067107318\n",
      "(2) For the fiscal years ended May 31, 2023 and 2022, expense for restricted stock units includes an immaterial amount of expense for PSUs.\n",
      "The income tax benefit related to stock-based compensation expense was  $71 million, $327 million and $297 million for the fiscal \n",
      "years ended May 31, 2023, 2022 and 2021, respectively, and reported within Income tax expense.\n",
      "\n",
      "---\n",
      "\n",
      "Chunk index: 402 - Relevance value: 8.743596539413996e-05\n",
      "STOCK OPTIONS\n",
      "The weighted average fair value per share of stock options granted during the years ended May 31, 2023, 2022 and 2021, \n",
      "computed as of the grant date using the Black-Scholes pricing model, was $31.31, $37.53 and $26.75, respectively. The \n",
      "weighted average assumptions used to estimate these fair values were as follows:\n",
      " YEAR ENDED MAY 31,\n",
      "2023 2022 2021\n",
      "Dividend yield  0.9 %  0.8 %  0.9 %\n",
      "Expected volatility  27.1 %  24.9 %  27.3 %\n",
      "Weighted average expected life (in years) 5.8 5.8 6.0\n",
      "Risk-free interest rate  3.3 %  0.9 %  0.4 %\n",
      "Expected volatilities are based on an analysis of the historical volatility of the Company's common stock, the implied volatility in\n",
      "\n",
      "---\n",
      "\n",
      "Chunk index: 403 - Relevance value: 2.6157880218789543e-06\n",
      "market traded options on the Company's common stock with a term greater than one year, as well as other factors. The weighted \n",
      "average expected life of options is based on an analysis of historical and expected future exercise patterns. The interest rate is \n",
      "based on the U.S. Treasury (constant maturity) risk-free rate in effect at the date of grant for periods corresponding with the \n",
      "expected term of the options.\n",
      "2023 FORM 10-K   75    The following summarizes the stock option transactions under the plan discussed above: \n",
      "SHARES(1)WEIGHTED AVERAGE \n",
      "OPTION PRICE\n",
      "(In millions)\n",
      "Options outstanding as of May 31, 2022  68.0 $ 88.66 \n",
      "Exercised  (7.5)  57.11 \n",
      "Forfeited  (1.5)  122.93 \n",
      "Granted  12.0  107.44 \n",
      "Options outstanding as of May 31, 2023  71.0 $ 94.40\n",
      "\n",
      "---\n",
      "\n",
      "Chunk index: 404 - Relevance value: 0.0038076746640864794\n",
      "(1) Includes stock appreciation rights transactions.\n",
      "Options exercisable as of May 31, 2023 were 44.7 million and had a weighted average option price of $79.95 per share. The \n",
      "aggregate intrinsic value for options outstanding and exercisable as of May 31, 2023 was $1,380 million and $1,307 million, \n",
      "respectively. The total intrinsic value of the options exercised during the years ended May 31, 2023, 2022 and 2021 was $438 \n",
      "million, $1,742 million and $1,571 million, respectively. The intrinsic value is the amount by which the market value of the \n",
      "underlying stock exceeds the exercise price of the options. The weighted average contractual life remaining for options \n",
      "outstanding and options exercisable as of May 31, 2023 was 5.9 years and 4.5 years, respectively. As of May 31, 2023, the\n",
      "\n",
      "---\n",
      "\n",
      "Chunk index: 405 - Relevance value: 0.5628123092810625\n",
      "Company had $425 million of unrecognized compensation costs from stock options, net of estimated forfeitures, to be recognized \n",
      "in Cost of sales or Operating overhead expense, as applicable, over a weighted average remaining perio d of 2.5 years.\n",
      "\n",
      "---\n",
      "\n",
      "Chunk index: 406 - Relevance value: 0.1677892888353876\n",
      "EMPLOYEE STOCK PURCHASE PLANS\n",
      "In addition to the Stock Incentive Plan, the Company gives employees the right to purchase shares at a discount from the market \n",
      "price under ESPPs. Subject to the annual statutory limit, employees are eligible to participate through payroll deductions of up to \n",
      "10% of their compensation. At the end of each six-month offering period, shares are purchased by the participants at 85% of the \n",
      "lower of the fair market value at the beginning or the end of the of fering period. Employees purchased 3.0 million, 2.0 million and \n",
      "2.5 million shares during each of the fiscal years ended May 31, 2023, 2022 and 2021, respectively.\n",
      "\n",
      "---\n",
      "\n",
      "Chunk index: 407 - Relevance value: 0.5124335580081907\n",
      "RESTRICTED STOCK AND RESTRICTED STOCK UNITS\n",
      "Recipients of restricted stock are entitled to cash dividends and to vote their respective shares throughout the period of \n",
      "restriction. Recipients of restricted stock units, which includes RS Us and PSUs, are entitled to dividend equivalent cash \n",
      "payments upon vesting. The number of shares of restricted stock and restricted stock units vested includes shares of common \n",
      "stock withheld by the Company on behalf of employees to satisfy the minimum statutory tax withholding requirements. \n",
      "The following summarizes the restricted stock and restricted stock units transactions under the plan discussed above: \n",
      "SHARES(1)WEIGHTED AVERAGE \n",
      "GRANT DATE  \n",
      "FAIR VALUE\n",
      "(In millions)\n",
      "Nonvested as of May 31, 2022  6.7 $ 130.88 \n",
      "Vested  (2.2)  114.85 \n",
      "Forfeited  (0.7)  131.10 \n",
      "Granted  4.5  115.56 \n",
      "Nonvested as of May 31, 2023  8.3 $ 126.97 \n",
      "         (1) Includes an immaterial amount of PSU transactions\n",
      "The weighted average fair value per share of restricted stock and restricted stock units granted for the fiscal years ended May 31, \n",
      "2023, 2022 and 2021, computed as of the grant date, was $115.56, $168.04 and $113.84, respectively. During the fiscal years \n",
      "ended May 31, 2023, 2022 and 2021, the aggregate fair value of vested restricted stock and restricted stock units was $250 \n",
      "million, $354 million and $310 million, respectively, computed as of the date of vesting. \n",
      "As of May 31, 2023, the Company had $649 million of unrecognized compensation costs from restricted stock and restricted \n",
      "stock units, net of estimated forfeitures, to be recognized in Cost of sales or Operating overhead expense, as applicable, over a \n",
      "weighted average remaining period of 2.3 years.\n",
      "\n",
      "---\n",
      "\n",
      "Chunk index: 408 - Relevance value: 0.0026702276192794045\n",
      "NIKE, INC.      76NOTE 10 — EARNINGS PER SHARE\n",
      "The following is a reconciliation from basic earnings per common share to diluted earnings per common share. The computations \n",
      "of diluted earnings per common share excluded restricted stock, restricted stock units and options, including shares under \n",
      "ESPPs, to purchase an estimated additional 31.7 million, 9.4 million and 11.3 million shares of common stock outstanding for the \n",
      "fiscal years ended May 31, 2023, 2022 and 2021, respectively, because the awards were assumed to be anti-dilutive.\n",
      " YEAR ENDED MAY 31,\n",
      "(In millions, except per share data) 2023 2022 2021\n",
      "Net income available to common stockholders $ 5,070 $ 6,046 $ 5,727 \n",
      "Determination of shares:\n",
      "Weighted average common shares outstanding  1,551.6  1,578.8  1,573.0 \n",
      "Assumed conversion of dilutive stock options and awards  18.2  32.0  36.4 \n",
      "DILUTED WEIGHTED AVERAGE COMMON SHARES OUTSTANDING  1,569.8  1,610.8  1,609.4 \n",
      "Earnings per common share:\n",
      "Basic $ 3.27 $ 3.83 $ 3.64 \n",
      "Diluted $ 3.23 $ 3.75 $ 3.56 \n",
      "\n",
      "---\n",
      "\n",
      "Chunk index: 409 - Relevance value: 0.3082711703236695\n",
      "NOTE 11 — BENEFIT PLANS\n",
      "The Company has a qualified 401(k) Savings and Profit Sharing Plan, in which all U.S. employees are able to participate. The \n",
      "Company matches a portion of employee contributions to the savings plan. Company contributions to the savings plan were $136 \n",
      "million, $126 million and $110 million and included in Cost of sales or Operating overhead expense, as applicable, for the fiscal \n",
      "years ended May 31, 2023, 2022 and 2021, respectively. \n",
      "The Company also has a Long-Term Incentive Plan (\"LTIP\") adopted by the Board of Directors and approved by shareholders in \n",
      "September 1997, which has been amended from time to time. The Company recognized an immaterial amount of Operating\n",
      "\n",
      "---\n",
      "\n",
      "Chunk index: 410 - Relevance value: 0.4521944744540437\n",
      "overhead expense related to cash awards under the LTIP during the years ended May 31, 2023, 2022 and 2021. During the fiscal \n",
      "years ended May 31, 2023 and 2022, under the Stock Incentive Plan, the Company granted PSUs which replaced cash-based \n",
      "long-term incentive awards historically granted under the Company's LTIP. Refer to Note 9 — Common Stock and Stock-Based \n",
      "Compensation for further information related to PSUs.\n",
      "The Company allows certain highly compensated employees and non-employee directors of the Company to defer compensation \n",
      "under a nonqualified deferred compensation plan. A rabbi trust was established to fund the Company's nonqualified deferred \n",
      "compensation plan obligation. The assets in the rabbi trust of approximately $875 million and $876 million as of May 31, 2023\n",
      "\n",
      "---\n",
      "\n",
      "Chunk index: 411 - Relevance value: 0.3679937186569107\n",
      "and 2022, respectively, primarily consist of company owned life insurance policies recorded at their cash surrender value and are \n",
      "classified in Deferred income taxes and other assets on the Consolidated B alance Sheets. Deferred compensation plan liabilities \n",
      "were $897 million and $890 million as of May 31, 2023 and 2022, respectively, and primarily classified in Deferred income taxes \n",
      "and other liabilities on the Consolidated Balance Sheets.\n",
      "The Company has pension plans in various countries worldwide. The pension plans are only available to local employees and are \n",
      "generally government mandated. The liability related to the unfunded pension liabilities of the plans was $29 million and $30\n",
      "\n",
      "---\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# print the individual chunks in the best segment - annotated with their chunk indexes and relevance values\n",
    "for chunk_index in best_segment_chunk_indexes:\n",
    "    chunk_text = chunks[chunk_index][\"chunk_text\"]\n",
    "    chunk_value = chunk_values[chunk_index]\n",
    "    print (f\"Chunk index: {chunk_index} - Relevance value: {chunk_value}\")\n",
    "    print (chunk_text)\n",
    "    print (\"\\n---\\n\")"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Looking at the content of each of these chunks, it's clear that chunks 397-401 are highly relevant, as expected. But looking closely at chunks 402-404, we can see they're actually also relevant, despite being marked as irrelevant by our ranking model. This is a common theme: chunks that are marked as not relevant, but are sandwiched between highly relevant chunks, are oftentimes quite relevant. In this case, the chunks were about stock option valuation, so while they weren't explicitly discussing stock-based compensation expenses (which is what we were searching for), in the context of the surrounding chunks it's clear that they are actually relevant."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "base",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.13"
  },
  "orig_nbformat": 4,
  "vscode": {
   "interpreter": {
    "hash": "44d0561a9d33f22b2e67e0485c48036e39d1c698628b030a9859974b559ff507"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
